﻿using Newtonsoft.Json;
using System;
using System.Security.Cryptography;
using System.Text;

namespace PddHelper.Framework
{
    /// <summary>
    /// aes对称加解密
    /// </summary>
    public class AesHelper
    {
        /// <summary>
        /// AES算法的keysize有一定限制。
        /// 具体来说，AES算法支持的keysize为 128 bits、192 bits 和 256 bits，而且只能以16 bits（即2个字节）为步长递增。
        /// 也就是说，支持的有效的 keysize 可以是：128、160、192、224 或 256。
        /// 需要注意的是，AES算法的 keysize 越大，加密强度越高，但同时也会增加加密运算所需的时间和计算资源。
        /// 因此，在实际应用中，需要根据实际需求和环境对 keysize 进行合理的选择。
        /// </summary>
        private static readonly int KeySize = 256;
        private static string key = "1gemZ6q8RRv5X2JAH/bUyn5LaWc1MC2vmfcRxbpTmS0=";//可以使用GenerateKey()生成 和PddHelperCore项目一起更换

        /// <summary>
        /// 生成秘钥
        /// </summary>
        /// <returns></returns>
        public static string GenerateKey()
        {
            using (var aes = Aes.Create())
            {
                aes.KeySize = KeySize;
                aes.Mode = CipherMode.ECB; // ECB 模式无需 IV 向量
                aes.Padding = PaddingMode.PKCS7;

                aes.GenerateKey();
                return Convert.ToBase64String(aes.Key);
            }
        }

        /// <summary>
        /// 加密
        /// </summary>
        /// <param name="str">明文</param> 
        /// <returns></returns>
        public static string Encrypt(string str)
        {
            if (!string.IsNullOrEmpty(str))
            {
                using (var aes = Aes.Create())
                {
                    aes.KeySize = KeySize;
                    aes.Mode = CipherMode.ECB; // ECB 模式无需 IV 向量
                    aes.Padding = PaddingMode.PKCS7;
                    aes.Key = Convert.FromBase64String(key);

                    ICryptoTransform encryptor = aes.CreateEncryptor();

                    byte[] plainBytes = Encoding.UTF8.GetBytes(str);
                    byte[] cipherBytes = encryptor.TransformFinalBlock(plainBytes, 0, plainBytes.Length);

                    return Convert.ToBase64String(cipherBytes);
                }
            }
            return str;
        }

        /// <summary>
        /// 解密
        /// </summary>
        /// <param name="str">密文</param> 
        /// <returns></returns>
        public static string Decrypt(string str)
        {
            if (!string.IsNullOrEmpty(str))
            {
                using (var aes = Aes.Create())
                {
                    aes.KeySize = KeySize;
                    aes.Mode = CipherMode.ECB; // ECB 模式无需 IV 向量
                    aes.Padding = PaddingMode.PKCS7;
                    aes.Key = Convert.FromBase64String(key);

                    ICryptoTransform decryptor = aes.CreateDecryptor();

                    byte[] cipherBytes = Convert.FromBase64String(str);
                    byte[] plainBytes = decryptor.TransformFinalBlock(cipherBytes, 0, cipherBytes.Length);

                    return Encoding.UTF8.GetString(plainBytes);
                }
            }
            return str;
        }
    }
}